import java.util.*;
public class Practice4{
    /*
    链接https://ac.nowcoder.com/acm/problem/229386
    一道dfs的题目, 画出决策树, 会比较好写, 这题没写出来.....

     */
    //全局变量存储数组方便一点
    public static int[] arr;//原始数据
    public static int n;//长度
    public static boolean[] vis;//判断是否被选过这个数组
    public static int ret;//返回值
    public static void main(String[] args){
        //初始化变量＋填数组
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        arr = new int[n + 1];
        vis = new boolean[n + 1];
        ret = 0;
        for(int i = 1;i <= n;i++){
            arr[i] = in.nextInt();
        }
        //dfs遍历
        dfs(0);
        System.out.println(ret);
    }

    private static void dfs(int pos){
        //长度到了直接返回, ret＋1说明这种情况可以
        if(pos == n){
            ret++;
            return;
        }
        for(int i = 1;i <= n;i++){
            //被选过个不要
            if(vis[i]){
                continue;
            }
            //这个数被提前选过了也不要
            if(vis[arr[i]]){
                break;
            }
            //这个数被选了标记
            vis[i] = true;
            //继续找下一个数
            dfs(pos + 1);
            //回溯
            vis[i] = false;

        }
    }
}